QuickSight データセットに設定した Athena で Partition Projection の終了日を変更したテーブルを同じ名前で再作成しても大丈夫かやってみた

QuickSight データセットに設定した Athena で Partition Projection の終了日を変更したテーブルを同じ名前で再作成しても大丈夫かやってみた

QuickSight データセットに設定した Athena で一度テーブルを削除し、 Partition Projection で range の終了日を変更した同じ名前のテーブルを再作成しても大丈夫かやってみました。
Clock Icon2024.10.22

コーヒーが好きな emi です。

以下ブログの通り、Athena の Partition Projection(パーティション射影)で range の終了日を NOW にしてしまい、日本時間の最新データが読み込めないテーブルを作成してしまいました。そしてそのまま QuickSight データセットのデータソースに設定してしまいました。

https://dev.classmethod.jp/articles/athena-partition-projection-range/

Athena 側で一度テーブルを削除し、 Partition Projection で range の終了日を変更した同じ名前のテーブルを再作成したいと思ったのですが、分析やダッシュボードが壊れたりしないか心配になったので、大丈夫か試してみました。

emiki_quicksight_datasource_change_1

S3 に CSV データを配置

以下のようなパスに、

s3://<S3 バケット名>/sweets_with_status/jst/2024/10/22/05/0500_sweets_with_status.csv

emiki_quicksight_datasource_change_2

以下のようなデータを日付を変えていくつか入れています。検証時間は 2024/10/22 05:00 JST くらいです。

0500_sweets_with_status.csv
datetime,department,section,status,chocolate,donut,osenbei
2024-10-22 05:00:00.000,コンピューティング部,EC2課,不調,1,1,1
2024-10-22 05:00:00.000,コンピューティング部,Lambda課,不調,1,1,1
2024-10-22 05:00:00.000,コンピューティング部,Lightsail課,不調,1,1,1
2024-10-22 05:00:00.000,ストレージ部,EFS課,超ごきげん,1,1,1
2024-10-22 05:00:00.000,ストレージ部,FSx課,ごきげん,1,1,1
2024-10-22 05:00:00.000,ストレージ部,S3課,不調,1,1,1
2024-10-22 05:00:00.000,データベース部,RDS課,普通,1,1,1
2024-10-22 05:00:00.000,データベース部,DocumentDB課,不調,1,1,1
2024-10-22 05:00:00.000,データベース部,DynamoDB課,超ごきげん,1,1,1

Athena テーブルの作成(NOW)

Athena テーブル sweets_with_status_2 を作成します。projection.partition_date.range の終了日を NOW にしておきます。これで、日本時間の最新データは取り込めない想定です。

sweets_with_status_2 テーブルの作成(NOW)
CREATE EXTERNAL TABLE IF NOT EXISTS `spiceincrementalupdatedb`.`sweets_with_status_2` (
  `datetime` timestamp,
  `department` string,
  `section` string,
  `status` string,
  `chocolate` int,
  `donut` int,
  `osenbei` int
)
PARTITIONED BY (
  `partition_date` string
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'
WITH SERDEPROPERTIES (
  'field.delim' = ',',
  'skip.header.line.count' = '1'
)
LOCATION 's3://<S3 バケット名>/sweets_with_status/jst/'
TBLPROPERTIES (
  'classification' = 'csv',
  'projection.enabled' = 'true',
  'projection.partition_date.type' = 'date',
  'projection.partition_date.format' = 'yyyy/MM/dd/HH',
  'projection.partition_date.range' = '2024/10/15/00,NOW',
  'projection.partition_date.interval' = '1',
  'projection.partition_date.interval.unit' = 'HOURS',
  'storage.location.template' = 's3://<S3 バケット名>/sweets_with_status/jst/${partition_date}'
);

できました。
emiki_quicksight_datasource_change_3

S3 からデータを取得できるか試します。

sweets_with_status_2 テーブルのデータ確認
SELECT * FROM "spiceincrementalupdatedb"."sweets_with_status_2";

できました。古い日付のデータは持ってこれていますが、最新時間の 2024/10/22 05:00 時点のデータは取得できていません。ここまで想定通りです。
emiki_quicksight_datasource_change_4

QuickSight データセット、分析、ダッシュボードの作成

作成した Athena をデータソースとして、QuickSight データセット、分析、ダッシュボードを作成します。
emiki_quicksight_datasource_change_5

emiki_quicksight_datasource_change_6

データソース名を指定しワークグループを選択します。データソースを作成します。
emiki_quicksight_datasource_change_7

カスタム SQL を設定します。
emiki_quicksight_datasource_change_8

emiki_quicksight_datasource_change_9

以下のようなカスタム SQL を作成しました。課ごとのおせんべいの枚数を取得するクエリです。

sweets_with_status_osenbei
SELECT 
    date_parse(partition_date, '%Y/%m/%d/%H') AS formatted_date,
    department,
    section,
    status,
    osenbei
FROM 
    spiceincrementalupdatedb.sweets_with_status_2
GROUP BY 
    partition_date,
    department,
    section,
    status,
    osenbei
ORDER BY 
    formatted_date,
    department,
    section

おせんべいの枚数を取得できました。日付は古い日付のデータのみ取得されています。
クエリモードを「SPICE」にして、「保存して視覚化」で分析も作成します。
emiki_quicksight_datasource_change_10

分析を作成したら「公開」でダッシュボードを作成します。
emiki_quicksight_datasource_change_11

ダッシュボード名を付けます。
emiki_quicksight_datasource_change_12

できました。
emiki_quicksight_datasource_change_13

Athena テーブルの削除(NOW)

では、Athena 側で作成した sweets_with_status_2 テーブルを削除します。
emiki_quicksight_datasource_change_14

emiki_quicksight_datasource_change_15

「テーブルを削除」からテーブル削除を進めると、以下のクエリが生成され実行されます。

sweets_with_status_2 テーブルの削除(NOW)
DROP TABLE `sweets_with_status_2`;

テーブルを削除しました。
emiki_quicksight_datasource_change_16

ここで、QuickSight コンソールに移動してデータセット、分析、ダッシュボードの様子を確認します。

SPICE にデータを取り込んでいるので、分析とダッシュボードは影響ありません。
emiki_quicksight_datasource_change_17

emiki_quicksight_datasource_change_18

データセットの編集をクリックすると、エラーで Athena にデータを取りに行けなくなっているのが分かります。
emiki_quicksight_datasource_change_19

エラー詳細
emiki_quicksight_datasource_change_20

sourceErrorMessage:	
[Simba][AthenaJDBC](100071) An error has been thrown from the AWS Athena client. 
TABLE_NOT_FOUND: line 9:5: Table 'awsdatacatalog.spiceincrementalupdatedb.sweets_with_status_2' does not exist [Execution ID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx]

カスタム SQL も見てみます。
emiki_quicksight_datasource_change_21

カスタム SQL は表示されますが、やはりデータは Athena に取りに行けなくなっています。
emiki_quicksight_datasource_change_22

Athena テーブルの再作成(NOW+9HOURS)

先ほどと同じ名前の Athena テーブル sweets_with_status_2 を、今度は projection.partition_date.range の終了日 NOW+9HOURS で再作成します。

Athena テーブル sweets_with_status_2 再作成用のクエリは以下です。

sweets_with_status_2 テーブルの作成(NOW+9HOURS)
CREATE EXTERNAL TABLE IF NOT EXISTS `spiceincrementalupdatedb`.`sweets_with_status_2` (
  `datetime` timestamp,
  `department` string,
  `section` string,
  `status` string,
  `chocolate` int,
  `donut` int,
  `osenbei` int
)
PARTITIONED BY (
  `partition_date` string
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'
WITH SERDEPROPERTIES (
  'field.delim' = ',',
  'skip.header.line.count' = '1'
)
LOCATION 's3://<S3 バケット名>/sweets_with_status/jst/'
TBLPROPERTIES (
  'classification' = 'csv',
  'projection.enabled' = 'true',
  'projection.partition_date.type' = 'date',
  'projection.partition_date.format' = 'yyyy/MM/dd/HH',
  'projection.partition_date.range' = '2024/10/15/00,NOW+9HOURS',
  'projection.partition_date.interval' = '1',
  'projection.partition_date.interval.unit' = 'HOURS',
  'storage.location.template' = 's3://<S3 バケット名>/sweets_with_status/jst/${partition_date}'
);

テーブルを再作成しました。
emiki_quicksight_datasource_change_23

S3 からデータを取得できるか試します。

sweets_with_status_2 テーブルのデータ確認
SELECT * FROM "spiceincrementalupdatedb"."sweets_with_status_2";

できました。今度は日本時間最新時間の 2024/10/22 05:00 時点のデータが取得できています。
emiki_quicksight_datasource_change_24

QuickSight データセットの編集画面に戻り、ブラウザを再読み込みすると……データが表示されました!こちらも、日本時間最新時間の 2024/10/22 05:00 時点のデータが取得できています。
emiki_quicksight_datasource_change_25

ここまでで QuickSight データセットが Athena 経由で S3 のデータを再取得できるようになりました。
分析とダッシュボードに日本時間の最新データを反映させるには、SPICE に読み込む必要があります。
データセットの詳細画面で「更新」タブを開き、「今すぐ更新」をクリックします。
emiki_quicksight_datasource_change_26

フル更新を選択して SPICE のデータを更新します。
emiki_quicksight_datasource_change_27

emiki_quicksight_datasource_change_28

ステータスが「実行中」→「完了」になれば OK です。
emiki_quicksight_datasource_change_29

emiki_quicksight_datasource_change_30

分析にも最新日付のおせんべいの枚数が表示されました!
emiki_quicksight_datasource_change_31

ダッシュボードにも反映されました。
emiki_quicksight_datasource_change_32

おわりに

同じ名前の Athena テーブルを再作成しても、テーブルの構造が同じなら問題なくデータが持ってこられることが確認できて良かったです。
Athena のテーブルはデータの実態を持たない View のようなもの(データの実態は S3 にある)なので再作成しても大丈夫であろうことは大先輩に確認したのですが、念のため挙動も確認しました。
どなたかのお役に立てば幸いです。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.